home *** CD-ROM | disk | FTP | other *** search
- PROCESSOR 6502
- INCLUDE "VCS.H"
-
- INCLUDE "SKELRAM.ASM"
-
- SEG ROM
- ORG $1000
-
- DC.B "Skeleton (c)2002 Eric Ball",0
-
- KERN0 STA WSYNC ;56-0
- LDA (MAZE0L),Y ;-5
- STA PF0 ;-8
- CPY BALLTOP ;-10
- BCC WAIT0 ;-12/13
- CPY BALLBOT ;-14
- BCS WAIT0 ;-16/17
- LDA #2 ;-18
- WAIT0 STA ENABL ;-21
- STX PF1 ;-24
- STX PF2 ;-27
- LDA (MAZE0R),Y ;-32
- STA PF0 ;-35
- INY ;-37
- LDA WALL ;-40
- CMP #1 ;-42
- BEQ WALL15 ;-44/45
- CPY #24 ;-46
- BNE KERN0 ;-48/49
- BEQ KERN20 ;-51
- WALL15 CPY #18 ;-47
- BCC KERN0 ;-49/50
- LDX #$FF ;-51
- CPY #24 ;-53
- BNE KERN0 ;-55/56
-
- WALL20 STA WSYNC ;44-0
- LDA #$80 ;-2
- STA PF0 ;-5
- LDA #$00 ;-7
- STA PF1 ;-10
- STA PF2 ;-13
- LDX #204-24 ;-15
- JSR XWALL ;-21
- DEX ;36-38
- JMP KERN170 ;-41
-
- KERN20 STA WSYNC ;72-0
- TXA ;-2
- AND #$0F ;-4
- ORA (MAZE1L),Y ;-9
- STA PF1 ;-12
- STX PF2 ;-15
- LDX #$80 ;-17
- STX PF0 ;-20
- LDX #4 ;-22
- WAIT20 DEX ;+2
- BNE WAIT20 ;+2/3
- AND #$0F ;41-43
- ORA (MAZE1R),Y ;-48
- STA PF1 ;-51
- INY ;-53
- LDA WALL ;-56
- CMP #2 ;-58
- BEQ WALL35 ;-60/61
- CPY #48 ;-62
- BNE KERN20 ;-64/65
- BEQ KERN40 ;-67
- WALL35 CPY #42 ;61-63
- BCC KERN20 ;-65/66
- DEX ;-67
- CPY #48 ;-69
- BNE KERN20 ;-71/72
-
- WALL40 STA WSYNC ;41-0
- LDA #$10 ;-2
- STA PF1 ;-5
- LDA #$00 ;-7
- STA PF2 ;-10
- LDX #180-48 ;-12
- JSR XWALL ;-18
- DEX ;36-38
- JMP KERN150 ;-41
-
- KERN40 STA WSYNC ;72-0
- LDA (MAZE2L),Y ;-5
- STA PF1 ;-8
- STX PF2 ;-11
- LDX #5 ;-13
- CPY SKELTOP ;-15
- BCC WAIT40 ;-17/18
- LDA (SKEL0),Y ;-22
- STA GRP0 ;-24
- LDA (SKEL1),Y ;-29
- STA GRP1 ;-32
- LDX #2 ;-34
- WAIT40 DEX ;+2
- BNE WAIT40 ;+2/3
- LDA (MAZE2R),Y ;42/43-47/48
- STA PF1 ;-50/51
- INY ;-53
- LDA WALL ;-56
- CMP #3 ;-58
- BEQ WALL55 ;-60/61
- CPY #72 ;-62
- BNE KERN40 ;-64/65
- LDA #$00 ;-66
- BEQ KERN60 ;-69
- WALL55 CPY #66 ;61-63
- BCC KERN40 ;-65/66
- DEX ;-67
- CPY #72 ;-69
- BNE KERN40 ;-71/72
-
- WALL60 STA WSYNC ;41-0
- LDA #$11 ;-2
- STA PF1 ;-5
- LDA #$00 ;-7
- STA PF2 ;-10
- LDX #156-72 ;-12
- JSR XWALL ;-18
- DEX ;36-38
- JMP KERN130 ;-41
-
- ; 18
- PVIEW1 INX ; center view subroutine
- TYA ; move forward one step
- CLC
- ADC PLAYDIR
- CMP SKELPOS ; check skeleton position
- BNE PVIEW2
- STX SKELDIS ; save if found
- PVIEW2 TAY ; check for wall
- LDA LVLMASK
- AND MAZES,Y ; BNE done after return
- RTS
-
- WAIT60 LDX #3 ;20-22
- WAIT61 DEX ;+2
- BNE WAIT61 ;+2/3
- BEQ KERN61 ;36-39
-
- KERN60 STA WSYNC ;70-0
- AND #$F0 ;-2
- ORA (MAZE3L),Y ;-7
- STA PF2 ;-10
- LDX #$11 ;-12
- STX PF1 ;-15
- CPY SKELTOP ;-17
- BCC WAIT60 ;-19/20
- TAX ;-21
- LDA (SKEL0),Y ;-26
- STA GRP0 ;-29
- LDA (SKEL1),Y ;-34
- STA GRP1 ;-37
- TXA ;-39
- KERN61 AND #$F0 ;39-41
- ORA (MAZE3R),Y ;-46
- STA PF2 ;-49
- INY ;-51
- LDA WALL ;-54
- CMP #4 ;-56
- BEQ WALL75 ;-58/59
- CPY #96 ;-60
- BNE KERN60 ;-62/63
- BEQ KERN80 ;-65
- WALL75 CPY #90 ;59-61
- BCC KERN60 ;-63/64
- LDA #$FF ;-65
- CPY #96 ;-67
- BNE KERN60 ;-69/70
-
- KERN80 STA WSYNC ;36-0
- LDA #$08 ;-2
- STA PF2 ;-5
- LDX #132-96 ;-7
- JSR XWALL ;-13
- DEX ;36-38
-
- KERN110 STA WSYNC ;56-0
- LDA (MAZE3L),Y ;-5
- STA PF2 ;-8
- LDX #4 ;-10
- CPY SKELBOT ;-12
- BCS WAIT110 ;-14/15
- LDA (SKEL0),Y ;-19
- STA GRP0 ;-22
- LDA (SKEL1),Y ;-27
- STA GRP1 ;-30
- LDX #1 ;-32
- WAIT110 DEX ;+2
- BPL WAIT110 ;+2/3
- LDA (MAZE3R),Y ;39/41-44/46
- STA PF2 ;-47/49
- INY ;-51
- CPY #156 ;-53
- BNE KERN110 ;-55/56
-
- KERN130 STA WSYNC ;64-0
- LDA (MAZE2L),Y ;-5
- STA PF1 ;-8
- STX PF2 ;-10
- LDX #4 ;-12
- CPY SKELBOT ;-14
- BCS WAIT130 ;-16/17
- LDA (SKEL0),Y ;-21
- STA GRP0 ;-24
- LDA (SKEL1),Y ;-29
- STA GRP1 ;-32
- LDX #1 ;-34
- WAIT130 DEX ;+2
- BPL WAIT130 ;+2/3
- LDA (MAZE2R),Y ;41/43-46/48
- STA PF1 ;-49/51
- INY ;-53
- CPY #162 ;-55
- BCC KERN130 ;-57/58
- LDX #$00 ;-59
- CPY #180 ;-61
- BNE KERN130 ;-63/64
- LDX #$FF ;-65
-
- KERN150 STA WSYNC ;64-0
- LDA (MAZE1L),Y ;-5
- STA PF1 ;-8
- STX PF2 ;-10
- LDX #4 ;-12
- CPY SKELBOT ;-14
- BCS WAIT150 ;-16/17
- LDA (SKEL0),Y ;-21
- STA GRP0 ;-24
- LDA (SKEL1),Y ;-29
- STA GRP1 ;-32
- LDX #1 ;-34
- WAIT150 DEX ;+2
- BPL WAIT150 ;+2/3
- LDA (MAZE1R),Y ;41/43-46/48
- STA PF1 ;-49/51
- INY ;-53
- CPY #186 ;-55
- BCC KERN150 ;-57/58
- LDX #$00 ;-59
- CPY #204 ;-61
- BNE KERN150 ;-63/64
- LDX #$FF ;-65
-
- KERN170 STA WSYNC ;48-0
- LDA (MAZE0L),Y ;-5
- STA PF0 ;-8
- CPY BALLTOP ;-10
- BCC WAIT170 ;-12/13
- CPY BALLBOT ;-14
- BCS WAIT170 ;-16/17
- LDA #2 ;-18
- WAIT170 STA ENABL ;-21
- STX PF1 ;-24
- STX PF2 ;-27
- LDA (MAZE0R),Y ;-32
- STA PF0 ;-35
- INY ;-37
- CPY #210 ;-39
- BCC KERN170 ;-41/42
- LDX #$00 ;-43
- CPY #228 ;-45
- BNE KERN170 ;-47/48
-
- LAST LDA #35*76/64+1
- STA WSYNC ;-0
- STA TIM64T ;-4
- STX PF0
-
- LDX SOUNDEL ; sound countdown
- BEQ COLUPA ; already zero?
- DEX
- BNE COLUPA ; zero?
- STX AUDV0 ; turn off sound
- STX AUDV1
-
- COLUPA STX SOUNDEL
- LDA SKELIFE ; skeleton still alive?
- BPL COLUPB
- LDX FIREDEL
- LDA SKELDIE,X
- BNE COLUPC
- BEQ COLUPC
- COLUPB LDA FIREDEL ; fire flash?
- CMP #45
- BCS FIRETST
- LDA MAZECOL ; set playfield colour
- STA COLUPF
- LDX SKELIFE ; set skeleton color
- LDA LIFELUM,X
- COLUPC STA COLUP0
- STA COLUP1
-
- FIRETST LDA INPT4 ; fire button
- AND #$80
- CMP THISFIR ; debounce
- BNE PLAYMOV ; not the same
- LDX LASTFIR ; check last button position
- STA LASTFIR ; save current
- BPL PLAYMOV ; do nothing if last was down
- ASL ; check current
- BCS PLAYMOV ; do nothing if up
- LDA FIREDEL ; check reload delay
- BNE PLAYMOV ; do nothing if reloading
- STA AUDF0 ; BANG!
- STA AUDF1
- LDA #8
- STA AUDC0
- STA AUDC1
- STA AUDV0
- STA AUDV1
- STA SOUNDEL
- LDA SKELDIS ; is skeleton in view?
- AND #$03
- BEQ SETDEL ; not in view
- LDA #$00 ; make skeleton turn
- SEC ; and face plaer
- SBC PLAYDIR
- STA SKELNXT
- LDA RANDOM ; generate random damage
- AND #$0F ; 0-15
- STA FIREDEL ; save temp
- LDA SKELIFE ; reduce skeleton life
- SEC
- SBC FIREDEL
- STA SKELIFE
- LDA FIREDEL ; set skeleton colour flash
- ASL
- ASL
- ASL
- ASL
- STA FIREDEL ; save msn
- LDX SKELIFE ; set luminance
- LDA LIFELUM,X
- ORA FIREDEL ; combine
- STA COLUP0
- STA COLUP1
- SETDEL LDA MAZECOL ; set playfield colour
- AND #$0F ; flash maze too
- STA COLUPF
- LDA #50 ; set reload timer = 1 sec
- STA FIREDEL
- BNE PLAYMOV
-
- PLAYMOV LDA SWCHA ; PLAYER MOVE
- ORA #$0F
- CMP THISMOV ; DEBOUNCE
- BNE SKELMOV
- LDX LASTMOV ; moved last frame?
- CPX #$FF
- BNE PMOVEA ; no
- CMP #$EF ; forward?
- BEQ PMOVEC
- CMP #$7F ; turn right?
- BEQ PMOVEB
- CMP #$BF ; turn left?
- BNE SKELMOV
- STA LASTMOV
- LDX PLAYDIR ; turn left
- LDA #$00
- SEC
- SBC PLAYRIG
- STX PLAYRIG
- STA PLAYDIR
- BNE SKELMOV
- PMOVEA CMP #$FF ; return to center?
- BNE SKELMOV
- STA LASTMOV ; centered
- BEQ SKELMOV
- PMOVEB STA LASTMOV ; right turn
- LDX PLAYRIG
- LDA #$00
- SEC
- SBC PLAYDIR
- STX PLAYDIR
- STA PLAYRIG
- BNE SKELMOV
- PMOVEC STA LASTMOV ; step forward
- LDA WALL
- CMP #1
- BEQ SKELMOV
- LDA PLAYPOS
- CLC
- ADC PLAYDIR
- STA PLAYPOS
- CMP SKELPOS
- BNE SKELMOV
- JMP GOTYOU
-
- SKELMOV LDA SKELIFE ; skeleton still alive?
- BMI SKELSTP
- DEC SKELDEL ; main skeleton movement delay
- BEQ SKDEL1
- SKELSTP JMP BOTTOM ; no movement, skip everything
-
- SKDEL1 LDA SKELSEC ; decrease rate counter
- SEC
- SBC SKELPER
- STA SKELSEC
- BCS SKDEL2 ; no carry = underflow
- ADC #50
- STA SKELSEC
- LDA SKELMIN
- SEC
- SBC SKELPER ; decrease square counter
- STA SKELMIN
- BCS SKDEL2 ; no carry = underflow
- ADC #80
- STA SKELMIN
- LDA SKELHRS
- SEC
- SBC SKELPER ; decrease cube counter
- STA SKELHRS
- BCS SKDEL2 ; no carry = underflow
- ADC #80
- STA SKELHRS
- DEC SKELPER ; speed up skeleton!
- SKDEL2 LDA SKELPER
- STA SKELDEL
-
- LDA SKELNXT ; forced move?
- BEQ SMOVEA ; nope, start the decision tree
- LDX #0 ; clear forced move flag
- STX SKELNXT
- CMP SKELDIR ; forced=facing?
- BNE SKNXT0
- JMP SMOVE1 ; step forward
- SKNXT0 STA SKELDIR ; turn and set SKELRIG correctly
- CMP #1
- BEQ SKNXT1
- BMI SKNXT2
- LDA #-1
- STA SKELRIG
- BNE SKELSTP
- SKNXT1 LDA #16
- STA SKELRIG
- BNE SKELSTP
- SKNXT2 CMP #-1
- BEQ SKNXT3
- LDA #1
- STA SKELRIG
- BNE SKELSTP
- SKNXT3 LDA #-16
- STA SKELRIG
- BNE SKELSTP
- SMOVEA LDX #0 ; direction flags
- LDA SKELPOS ; can we go forward?
- CLC
- ADC SKELDIR
- TAY
- LDA LVLMASK
- AND MAZES,Y
- BNE SMOVED ; can't go forward
- INX ; forward flag
- LDA #$01 ; determine facing
- BIT SKELDIR ; use bit to test for neg too
- BNE SMOVEB ; SKELDIR = +1/-1
- LDA PLAYPOS ; check for player in same column
- SEC
- SBC SKELPOS
- AND #$0F
- BNE SMOVED
- JMP SMOVE1
- SMOVEB BMI SMOVEC ; SKELDIR = -1
- LDA PLAYPOS
- SEC
- SBC SKELPOS
- AND #$F0 ; player ahead
- BNE SMOVED
- JMP SMOVE1
- SMOVEC LDA SKELPOS ; player ahead (behind)
- SEC
- SBC PLAYPOS
- AND #$F0 ; player ahead
- BNE SMOVED
- BEQ SMOVE1
- SMOVED LDA SKELPOS ; can we go right?
- CLC
- ADC SKELRIG
- TAY
- LDA LVLMASK
- AND MAZES,Y
- BNE SMOVEE
- INX
- INX
- SMOVEE LDA SKELPOS ; can we go left?
- SEC
- SBC SKELRIG
- TAY
- LDA LVLMASK
- AND MAZES,Y
- BNE SMOVEF
- INX
- INX
- INX
- INX
- SMOVEF CPX #0
- BEQ SMOVE0 ; no directions, turn around
- DEX
- BEQ SMOVE1 ; forward only
- DEX
- BEQ SMOVE2 ; right only
- DEX
- BEQ SMOVE3 ; right or forward
- DEX
- BEQ SMOVE4 ; left only
- DEX
- BEQ SMOVE5 ; left or forward
- DEX
- BEQ SMOVE6 ; right or left
- BIT RANDOM ; all directions
- BPL SMOVE1
- BMI SMOVE6
- SMOVE0 LDA #$00 ; turn around
- SEC
- SBC SKELDIR
- STA SKELDIR
- LDA #$00
- SEC
- SBC SKELRIG
- STA SKELRIG
- JMP BOTTOM
- SMOVE2 LDX SKELRIG ; turn right
- LDA #$00
- SEC
- SBC SKELDIR
- STX SKELDIR
- STA SKELRIG
- STX SKELNXT ; force forward
- JMP BOTTOM
- SMOVE3 BIT RANDOM
- BPL SMOVE1
- BMI SMOVE2
- SMOVE4 LDX SKELDIR ; turn left
- LDA #$00
- SEC
- SBC SKELRIG
- STX SKELRIG
- STA SKELDIR
- STA SKELNXT ; force forward
- JMP BOTTOM
- SMOVE5 BIT RANDOM
- BPL SMOVE1
- BMI SMOVE4
- SMOVE6 BIT RANDOM
- BVC SMOVE2
- BVS SMOVE4
- SMOVE1 LDA SKELPOS ; step forward
- CLC
- ADC SKELDIR
- STA SKELPOS
- CMP PLAYPOS
- BNE SMOVE7
- JMP GOTYOU
- SMOVE7 LDA SOUNDEL ; check for existing sound
- BNE BOTTOM
- JSR SKPOSXY ; calculate distance for sound
- JSR PDIRXY
- JSR SKSTEP
- LDA #1
- STA AUDC0
- STA AUDC1
- LDA RANDOM
- ORA #30
- STA AUDF0
- STA AUDF1
- CPX #-15
- BPL AUDX
- LDX #-15
- AUDX STX AUDV0 ; left speaker
- CPY #-15
- BPL AUDY
- LDY #-15
- AUDY STY AUDV1 ; right speaker
- LDA SKELDEL
- LSR
- STA SOUNDEL
-
- BOTTOM JSR DOVSYNC
-
- NEWSKEL LDA SKELIFE ; skeleton dead?
- BPL PVIEW
- LDA FIREDEL ; done death flash?
- BNE PVIEW
- LDX SKELNUM ; increment skeleton life
- INX
- STX SKELNUM
- STX SKELIFE
- LDX MAZECOL ; increment maze luminance
- INX
- TXA
- AND #$0F
- CMP #13
- BEQ NEXTLVL ; ten down, new level
- STX MAZECOL
- LDA #$00
- STA SKELPOS
- JSR SKPOSXY ; figure out restart position
- ; LDA SKELX
- BPL NEWSK1
- EOR #$FF ; NEG
- CLC
- ADC #$01
- NEWSK1 BIT SKELY
- BPL NEWSK2
- SEC
- SBC SKELY
- BPL NEWSK3
- NEWSK2 CLC
- ADC SKELY
- NEWSK3 CMP #$07
- BPL NEWSK4
- LDA #120
- STA SKELPOS
- NEWSK4 LDX #LOADDEL-LOADRAM; reset skeleton move timers
- BNE REINIT
- NEXTLVL TXA ; increment maze colour
- CLC
- ADC #$16
- STA MAZECOL
- LDX #LOADLVL-LOADRAM
- ASL LVLMASK
- BNE REINIT
- JMP YOUWIN
-
- REINIT LDA LOADRAM-1,X ; refresh initial values
- STA RAMLOAD-1,X
- DEX
- BNE REINIT
-
- PVIEW LDX #0 ; center view & skeleton distance
- STX SKELDIS
- LDY PLAYPOS
- JSR PVIEW1
- BNE PVIEWA
- JSR PVIEW1
- BNE PVIEWA
- JSR PVIEW1
- BNE PVIEWA
- JSR PVIEW1
- BNE PVIEWA
- INX
- PVIEWA STX WALL ; save wall distance
- LDA PLAYPOS ; right view, step 1
- CLC
- ADC PLAYRIG
- LDX #MAZE1R+1 ; save bits here
- PVIEWE JSR PVIEW3 ; test and save bits
- CPX #MAZE3R+2
- BNE PVIEWE
- LDA PLAYPOS ; left view, step 1
- SEC ;
- SBC PLAYRIG ;
- LDX #MAZE1L+1 ; save bits here
- PVIEWF JSR PVIEW3 ;
- CPX #MAZE3L+2 ;
- BNE PVIEWF ;
- LDX #MAZE1R+1 ; right view, step 2
- LDY #MAZE0R ;
- PVIEWG JSR PVIEW4 ; change bits to pointers
- CPY #MAZE3R+2 ;
- BNE PVIEWG ;
- LDX #MAZE1L+1 ; left view, step 2
- LDY #MAZE0L ;
- PVIEWH JSR PVIEW4 ; change bits to pointers
- CPY #MAZE3L+2 ;
- BNE PVIEWH ;
-
- LDA SWCHB ; check difficulty switch
- AND #$40
- BEQ DOBALL
- STA BALLTOP ; set top & bottom same
- STA BALLBOT ; to prevent ball display
- BNE NOBALL
- DOBALL JSR SKPOSXY ; add skeleton direction pointer
- JSR PDIRXY
- JSR POSBALL
-
- NOBALL LDA SKELDIS ; skeleton view
- AND #$03 ; check distance
- BNE SKPOSA
- STA SKELBOT ; force skeleton off
- SBC #1 ; by reversing top & bottom
- STA SKELTOP
- JMP SKVIEW0
- SKPOSA SEC ; decrement for table access
- SBC #1
- ASL ; multiply by 16
- ASL
- ASL
- ASL
- TAY
- LDA SKTABLE,Y ; use table to update RAM
- STA HMCLR
- STA HMP0
- LDA SKTABLE+1,Y
- STA SKELTOP
- LDA SKTABLE+2,Y
- STA SKELBOT
- LDA SKTABLE+3,Y
- STA NUSIZ0
- STA NUSIZ1
- LDA PLAYDIR ; figure out facing
- CMP SKELDIR
- BEQ SKPOSB ; same dir = back
- CMP SKELRIG ; left
- BEQ SKPOSC
- CLC
- ADC SKELDIR
- BEQ SKPOSD ; inverse = front
- LDA SKTABLE+8,Y ; must be right
- STA SKEL1 ; arm on the right
- LDA SKTABLE+9,Y
- STA SKEL1+1
- LDA SKTABLE+10,Y ; body on the left
- STA SKEL0
- LDA SKTABLE+11,Y
- STA SKEL0+1
- LDA #$18 ; mirror both
- BNE SKVIEW
- SKPOSB LDA SKTABLE+6,Y ; back for both
- STA SKEL0
- STA SKEL1
- LDA SKTABLE+7,Y
- STA SKEL0+1
- STA SKEL1+1
- LDA #$08 ; left normal, right mirror
- BNE SKVIEW
- SKPOSC LDA SKTABLE+8,Y ; arm on the left
- STA SKEL0
- LDA SKTABLE+9,Y
- STA SKEL0+1
- LDA SKTABLE+10,Y ; body on the right
- STA SKEL1
- LDA SKTABLE+11,Y
- STA SKEL1+1
- LDA #$00 ; no mirror
- BEQ SKVIEW
- SKPOSD LDA SKTABLE+4,Y ; front for both
- STA SKEL0
- STA SKEL1
- LDA SKTABLE+5,Y
- STA SKEL0+1
- STA SKEL1+1
- LDA #$08 ; left normal, right mirror
- SKVIEW STA WSYNC ; hmove P0 for size
- STA HMOVE
- STA REFP1 ; set reflection registers
- LSR
- STA REFP0
- STA WSYNC
- STA HMOVE
-
- SKVIEW0 JSR WAITIM
-
- LDA INPT4 ; save button for debounce
- AND #$80
- STA THISFIR
- LDX FIREDEL ; decrement reload counter
- BEQ RELOAD
- DEX
- STX FIREDEL
-
- RELOAD LDA SWCHA ; save joystick for debounce
- ORA #$0F
- STA THISMOV
-
- LDY #$00
- LDX #$00
- JMP KERN0
-
- ; 44
- SKTABLE DC.B $70, 83, 192, $07
- DC.W SKFRON1-83, SKBACK1-83
- DC.W SKARM1-83, SKBODY1-83
- DC.B $45, $72, $69, $63
- DC.B $F0, 95, 168, $05
- DC.W SKFRON2-95, SKBACK2-95
- DC.W SKARM2-95, SKBODY2-95
- DC.B $42, $61, $6C, $6C
- DC.B $B0, 107, 144, $00
- DC.W SKFRON3-107, SKBACK3-107
- DC.W SKARM3-107, SKBODY3-107
-
- ; 37
- XWALL0 STA WSYNC ;46-0
- LDA #0 ;-2
- CPY BALLTOP ;-4
- BCC XWALL1 ;-6/7
- CPY BALLBOT ;-8
- BCS XWALL1 ;-10/11
- LDA #2 ;-12
- XWALL1 STA ENABL ;-15
- XWALL CPY SKELTOP ;-17
- BCC XWALL2 ;-19/20
- CPY SKELBOT ;-21
- BCS XWALL2 ;-23/24
- LDA (SKEL0),Y ;-28
- STA GRP0 ;-31
- LDA (SKEL1),Y ;-36
- STA GRP1 ;-39
- XWALL2 INY ;-41
- DEX ;-43
- BNE XWALL0 ;-45/46
- RTS ;-51
-
- ; 12
- RAND LDA RANDOM ; simple 8 bit LFSR
- BEQ XSEED ;+5/6
- LSR ;+7
- BCC SRAND ;+9/10
- XSEED EOR #$A9 ;+6/9-8/11
- SRAND STA RANDOM ;+8/10/11-11/14
- RTS ;+17/20
-
- ; 59
- POSBALL TXA ; SKELX/Y into BALLTOP/BOT & RESBL
- BEQ PBALL1
- BMI PBALL2
- LDA #3
- BNE PBALL3
- PBALL1 LDA #108
- BNE PBALL3
- PBALL2 LDA #213
- PBALL3 STA BALLTOP
- CLC
- ADC #12
- STA BALLBOT
- TYA
- BEQ PBALL4
- BPL PBALL5
- LDA #$60
- LDY #3
- BNE PBALL6
- PBALL4 LDA #$40
- LDY #6
- BNE PBALL6
- PBALL5 LDA #$20
- LDY #9
- PBALL6 STY WSYNC ; -0
- STY RESBL ; -3
- PBALL0 DEY ; +2
- STY RESBL ; +3
- BNE PBALL0 ; +2/3
- STA WSYNC
- STA HMBL
- STA HMOVE
- RTS
-
- ; 51
- DOVSYNC JSR WAITIM
- LDA #$02
- STA VSYNC
- JSR RAND ; cycle LFSR
- LDA #$31 ; ball width = 8
- STA CTRLPF ; reflect playfield
- STA WSYNC ; set initial skeleton position
- LDX #8 ;-2
- SKPOS0 DEX ;+2
- BNE SKPOS0 ;+2/3
- STA RESP0 ;46-49
- LDA #$60 ; shift left half left
- STA RESP1
- STA HMP0
- LDA #$40 ; center right half (final position)
- STA HMP1
- STA WSYNC
- STA HMOVE
- LDA #45*76/64+1
- STA WSYNC
- STA TIM64T
- LDA #$00
- STA VSYNC
- STA HMCLR
- RTS
-
- ORG $1700-109
- SKARM1 DS 27
- HEX 3F 3F
- DS 80
- SKARM2 EQU SKARM1+9
- SKARM3 EQU SKARM1+18
-
- ORG $1700
- ; 80
- LIFELUM DC.B 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4
- DC.B 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6
- DC.B 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10
- DC.B 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12
- DC.B 12, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
-
- ; 30
- PVIEW4 LDA $00,X ; right/left step 2 subroutine
- BEQ PVIEW5 ; open found, check next
- LDA #>TYPE0 ; closed, show wall
- BNE PVIEW7
- PVIEW5 LDA $01,X ; is next open too?
- BEQ PVIEW6
- LDA #>TYPE1 ; open, show hole
- BNE PVIEW7
- PVIEW6 LDA #>TYPE2 ; both open, show Y
- PVIEW7 INX ; next test position
- STA $0001,Y ; pointer MSB to RAM
- LDA #$00
- STA $0000,Y ; LSB = 0
- INY ; next pointer position
- INY
- RTS
-
- ORG $1800-146
- SKFRON2 HEX 03 03 07 07 05 05 06 06 03 03 02 02 03 03 01 01
- HEX 3F 3F 41 41 4F 4F 41 41 4F 4F 41 41 4F 4F 21 21
- HEX 2F 2F 21 21 27 27 53 53 51 51 02 02 02 02 02 02
- HEX 02 02 02 02 02 02 02 02 04 04 02 02 02 02 02 02
- HEX 02 02 02 02 02 02 1E 1E 00
- SKBACK2 HEX 03 03 07 07 07 07 07 07 03 03 03 03 03 03 01 01
- HEX 3F 3F 5F 5F 4F 4F 41 41 4F 4F 41 41 4F 4F 21 21
- HEX 2F 2F 21 21 27 27 53 53 51 51 02 02 02 02 02 02
- HEX 02 02 02 02 02 02 02 02 04 04 02 02 02 02 02 02
- HEX 02 02 02 02 02 02 1E 1E 00
-
- ORG $1800
- ; 170
- TITLEPF HEX FF4B0B7D89 ; SKELETON
- HEX 115208129A
- HEX F7630912AA
- HEX 81520812CA
- HEX FF4B7B1189
- HEX 0000000000
- HEX 0100388000 ; BY
- HEX 0100488000
- HEX 0A00380000
- HEX 0400480000
- HEX 0400380000
- HEX 0000000000
- HEX FE73391910 ; ERIC BALL
- HEX 124904A510
- HEX 7E71043D10
- HEX 124904A510
- HEX FE4B3925F7
-
- GOT HEX FF FF F8 FF F8
- HEX 30 00 CC 60 CC
- HEX 30 3F 78 60 78
- HEX 30 03 E0 60 E0
- HEX F0 FF E0 60 E0
- HEX 00 00 00 00 00
- YOU HEX 33 03 FC 03 FC
- HEX 33 03 0C 03 0C
- HEX F3 FF 0C 03 0C
- HEX 03 60 0C 03 0C
- HEX 0F 60 FC FF FC
- HEX 00 00 00 00 00
- WIN HEX 33 03 FC 07 FC
- HEX 33 63 80 1B 80
- HEX B3 9B 80 63 80
- HEX 7B 07 80 83 80
- HEX 37 03 FC 03 FC
-
- ; 13
- INIT LDX #LOADEND-LOADRAM
- INITL LDA LOADRAM-1,X ; copy in initial values
- STA RAMLOAD-1,X
- DEX
- BNE INITL
- JMP LAST
-
- ORG $1900-73
- SKBODY2 HEX 70 70 F8 F8 B8 B8 78 78 F8 F8 78 78 D0 D0 10 10
- HEX 78 78 F8 F8 F8 F8 08 08 F8 F8 08 08 F8 F8 08 08
- HEX 38 38 08 08 38 38 38 38 38 38 10 10 10 10 10 10
- HEX 10 10 10 10 10 10 10 10 20 20 10 10 10 10 10 10
- HEX 10 10 10 10 10 10 70 70 00
-
- ORG $1900
- MAZES HEX 00 00 05 61 75 0B CA 51 93 01 1E 40 A8 61 C9 BA
- HEX 45 FA 1E 82 0D BD 62 24 1D E4 2A D3 9C 33 55 26
- HEX 41 C2 03 70 42 05 31 8E 5C 77 20 74 50 21 89 81
- HEX 39 36 09 95 3A 8A 40 61 D4 50 88 53 CB 67 72 16
- HEX 44 84 6A 04 45 E9 16 98 1A 23 05 37 43 58 90 29
- HEX CA 31 D1 92 7C 43 17 64 41 84 5C 92 0B A4 13 C5
- HEX 10 3F 7D 11 C0 42 AA 66 BB 02 21 60 76 60 AA 0E
- HEX 30 F4 01 87 68 55 93 50 00 44 9F 08 C1 A8 35 40
- HEX E9 E2 08 71 E2 43 3D 54 FB 40 76 22 96 06 52 D8
- HEX 7F 03 16 D0 5C 81 09 82 45 81 08 83 6C 41 A9 74
- HEX 46 80 68 41 3B B5 57 B2 2C B6 75 12 20 92 06 8B
- HEX 41 B9 16 C7 07 50 1B 42 21 61 58 D0 4D 31 C8 30
- HEX 14 4B 82 BA 01 F8 B6 4A 97 C9 46 71 C7 46 46 49
- HEX 86 23 57 0C 42 55 14 05 21 30 84 49 75 4C F1 30
- HEX 40 38 94 24 F3 DC 7E D3 09 CE 11 23 83 4A 62 2D
- HEX C3 7C 97 48 C2 00 35 31 3D 40 E0 6D 33 07 94 10
-
- ORG $1A00
- TYPE0 ; NO OPENING
- HEX 101010101010 ; MAZE0 PF0
- HEX 202020202020
- HEX 404040404040
- HEX 808080808080
- HEX 808080808080 ; MAZE1 PF1
- HEX 404040404040
- HEX 202020202020
- HEX 101010101010
- HEX 181818181818 ; MAZE2 PF1
- HEX 141414141414
- HEX 121212121212
- HEX 111111111111
- HEX 010101010101 ; MAZE3 PF2
- HEX 020202020202
- HEX 040404040404
- HEX 080808080808
-
- ; 36
- START SEI ; enable interupts
- CLD ; turn off BCD math
- LDA #$00 ; clear zero page memory & registers
- LDX #$44 ; start with the TIA shadow
- NULL STA 0,X
- INX
- BNE NULL
- STX TITLEX ; <TITLEPF = 0
- DEX ; set stack to bottom of RAM
- TXS
-
- STX COLUPF ; set up title screen
- LDA #<GOT
- STA TITLEND
- LDY #13
- STY TITLEY
- LDA #38*76/64+1
- STA TITLBOT
- LDA #49*76/64+1
- STA TITLTOP
- JMP TITLE3
-
- HEX F8F8F8F8F8F8 ; MAZE3 PF2
- HEX 040404040404
- HEX 020202020202
- HEX 010101010101
- HEX 111111111111 ; MAZE2 PF1
- HEX 121212121212
- HEX 141414141414
- HEX 181818181818
- HEX 1F1F1F1F1F1F ; MAZE1 PF1
- HEX 202020202020
- HEX 404040404040
- HEX 808080808080
- HEX 808080808080 ; MAZE0 PF0
- HEX 404040404040
- HEX 202020202020
- HEX 101010101010
-
- ; 38
- SKSTEP STY SKELY
- TXA
- BMI SKSTEP1 ; skeleton behind
- EOR #$FF ; NEG
- CLC
- ADC #$01
- BMI SKSTEP2
- SKSTEP1 ASL ; multiply by 2
- SKSTEP2 STA SKELX
- TYA
- BPL SKSTEP3 ; skeleton right
- CLC
- ADC SKELX
- TAX ; left = X + Y
- CLC
- ADC SKELY
- TAY ; right = X + 2Y
- RTS
- SKSTEP3 LDA SKELX
- SEC
- SBC SKELY
- TAY ; right = X - Y
- SEC
- SBC SKELY
- TAX ; left = X - 2Y
- RTS
-
- ; 46
- PDIRXY LDA #$01 ; adjust SKELXY for PDIR
- BIT PLAYDIR
- BEQ PDIRXY2 ; PLAYDIR = 16 or -16
- BMI PDIRXY1 ; PLAYDIR = -1
- LDX SKELX ; PLAYDIR = 1
- LDY SKELY
- RTS
- PDIRXY1 LDA SKELX ; rotate 180
- EOR #$FF ; NEG
- TAX
- INX
- LDA SKELY
- EOR #$FF ; NEG
- TAY
- INY
- RTS
- PDIRXY2 BMI PDIRXY3 ; PLAYDIR = -16
- LDX SKELY ; PLAYDIR = 16
- LDA SKELX ; rotate 90
- EOR #$FF ; NEG
- TAY
- INY
- RTS
- PDIRXY3 LDA SKELY ; rotate -90
- EOR #$FF ; NEG
- TAX
- INX
- LDY SKELX
- RTS
-
- ; 51
- SKELDIE HEX 00 20 40 60 81 A1 C1 D2 B2 92 73 53 33 24 44 64
- HEX 85 A5 C5 D6 B6 96 77 57 37 28 48 68 88 A9 C9 D9
- HEX BA 9A 7A 5B 3B 2B 4C 6C 8C AD CD DD BE 9E 7E 5F
- HEX 3F 2F 4F
-
- ORG $1C00-146
- SKFRON1 HEX 03 03 03 07 07 07 05 05 05 06 06 06 03 03 03
- HEX 02 02 02 03 03 03 01 01 01 3F 3F 3F 41 41 41
- HEX 4F 4F 4F 41 41 41 4F 4F 4F 41 41 41 4F 4F 4F
- HEX 21 21 21 2F 2F 2F 21 21 21 27 27 27 53 53 53
- HEX 51 51 51 02 02 02 02 02 02 02 02 02 02 02 02
- HEX 02 02 02 02 02 02 02 02 02 04 04 04 02 02 02
- HEX 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
- HEX 1E 1E 1E 00
- SKFRON3 HEX 03 07 05 06 03 02 03 01 3F 41 4F 41 4F 41 4F 21 2F 21 27
- HEX 53 51 02 02 02 02 02 02 02 04 02 02 02 02 02 02 1E 00
-
- ORG $1C00
- TYPE1 ; OPENING
- HEX 000000000000 ; MAZE0 PF0
- HEX 000000000000
- HEX 000000000000
- HEX F0F0F0F0F0F0
- HEX 000000000000 ; MAZE1 PF1
- HEX 000000000000
- HEX 000000000000
- HEX F0F0F0F0F0F0
- HEX 101010101010 ; MAZE2 PF1
- HEX 101010101010
- HEX 101010101010
- HEX 1F1F1F1F1F1F
- HEX 000000000000 ; MAZE3 PF2
- HEX 000000000000
- HEX 000000000000
- HEX 0F0F0F0F0F0F
-
- ; 36
- SKPOSXY LDA SKELPOS ; change SKPOS-PLAYPOS to SKELX+SKELY
- SEC
- SBC PLAYPOS
- STA SKELX
- LSR
- LSR
- LSR
- LSR
- BIT TESTBIT ; negative?
- BEQ SKXY2
- ORA #$F0
- SKXY2 STA SKELY
- LDA SKELX
- BIT TESTBIT ; negative?
- BEQ SKXY3
- INC SKELY
- ORA #$F0
- BMI SKXY4
- SKXY3 AND #$0F
- SKXY4 STA SKELX
- RTS
-
- HEX FFFFFFFFFFFF ; MAZE3 PF2
- HEX 040404040404
- HEX 020202020202
- HEX 010101010101
- HEX 1F1F1F1F1F1F ; MAZE2 PF1
- HEX 121212121212
- HEX 141414141414
- HEX 181818181818
- HEX FFFFFFFFFFFF ; MAZE1 PF1
- HEX 202020202020
- HEX 404040404040
- HEX 808080808080
- HEX F0F0F0F0F0F0 ; MAZE0 PF0
- HEX 404040404040
- HEX 202020202020
- HEX 101010101010
-
- ; 28
- GOTYOU LDY #<WIN-5
- LDX #<GOT
- BNE GOTYOU2
- YOUWIN LDY #<SKBODY3
- LDX #<YOU
- GOTYOU2 STY TITLEND
- STX TITLEX
- LDY #20
- STY TITLEY
- LDA #39*76/64+1
- STA TITLBOT
- LDA #49*76/64+1
- STA TITLTOP
- BNE TITLE1
-
- ; 110
- TITLE3 LDA #$02
- STA VSYNC
- STA WSYNC
- JSR RAND ; cycle LFSR
- STA WSYNC
- LDA TITLTOP
- STA WSYNC
- STA TIM64T
- LDA #$00
- STA VSYNC
- LDX TITLEX
- TITLE2 JSR WAITIM
- TITLE STA WSYNC
- LDA TITLEPF+1,X ;-4
- STA PF1 ;-7
- LDA TITLEPF+2,X ;-11
- STA PF2 ;-14
- LDA TITLEPF,X ;-18
- STA PF0 ;-21
- ASL ;-23
- ASL ;-25
- ASL ;-27
- ASL ;-31
- STA PF0 ;-34
- LDA TITLEPF+3,X ;-38
- STA PF1 ;-41
- LDA TITLEPF+4,X ;-45
- DEY ;-47
- BNE TITLE0 ;-49/50
- LDY TITLEY ;-52
- INX ;-54
- INX ;-56
- INX ;-58
- INX ;-60
- INX ;-62
- TITLE0 STA PF2 ;50/62-53/65
- CPX TITLEND ;-67
- BNE TITLE ;-69/70
- LDA TITLBOT ;-72
- STA WSYNC ;-0
- STA TIM64T ;-4
- LDA #0
- STA PF0
- STA PF1
- STA PF2
- STA AUDV0
- STA AUDV1
- LDA SWCHB ; check reset/select
- AND #$03
- CMP #$03
- BEQ TITLE1
- JMP INIT
- TITLE1 JSR WAITIM
- BEQ TITLE3
-
- ORG $1E00-146
- SKBACK1 HEX 03 03 03 07 07 07 07 07 07 07 07 07 03 03 03
- HEX 03 03 03 03 03 03 01 01 01 3F 3F 3F 5F 5F 5F
- HEX 4F 4F 4F 41 41 41 4F 4F 4F 41 41 41 4F 4F 4F
- HEX 21 21 21 2F 2F 2F 21 21 21 27 27 27 53 53 53
- HEX 51 51 51 02 02 02 02 02 02 02 02 02 02 02 02
- HEX 02 02 02 02 02 02 02 02 02 04 04 04 02 02 02
- HEX 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
- HEX 1E 1E 1E 00
- SKBACK3 HEX 03 07 07 07 03 03 03 01 3F 5F 4F 41 4F 41 4F 21 2F 21 27
- HEX 53 51 02 02 02 02 02 02 02 04 02 02 02 02 02 02 1E 00
-
- ORG $1E00
- TYPE2 ; CORRIDOR
- HEX 000000000000 ; MAZE0 PF0
- HEX 000000000000
- HEX 000000000000
- HEX 808080808080
- HEX 000000000000 ; MAZE1 PF1
- HEX 000000000000
- HEX 000000000000
- HEX 101010101010
- HEX 101010101010 ; MAZE2 PF1
- HEX 101010101010
- HEX 101010101010
- HEX 111111111111
- HEX 000000000000 ; MAZE3 PF2
- HEX 000000000000
- HEX 000000000000
- HEX 080808080808
-
- ; 8
- WAITIM STA WSYNC ;-0
- LDA INTIM ;-4
- BNE WAITIM ; wait for bottom of frame
- RTS
-
- ; 14
- LOADRAM DC.B 50 ; SKELDEL
- DC.B 50 ; SKELPER
- DC.B 25 ; SKELSEC
- DC.B 40 ; SKELMIN
- DC.B 40 ; SKELHRS
- LOADDEL EQU .
- DC.B $00 ; PLAYPOS
- DC.B 1 ; PLAYDIR
- DC.B 16 ; PLAYRIG
- DC.B $88 ; SKELPOS
- DC.B 1 ; SKELDIR
- DC.B 16 ; SKELRIG
- LOADLVL EQU .
- DC.B $08 ; TESTBIT
- DC.B 1 ; LVLMASK
- DC.B $23 ; MAZECOL
- LOADEND EQU .
-
- ; 14
- PVIEW3 TAY ; right/left step 1 subroutine
- LDA LVLMASK ; move bits from ROM to RAM
- AND MAZES,Y
- STA $00,X
- INX
- TYA
- CLC ; move forward one step
- ADC PLAYDIR
- RTS
-
- HEX FFFFFFFFFFFF ; MAZE3 PF2
- HEX 040404040404
- HEX 020202020202
- HEX 010101010101
- HEX 1F1F1F1F1F1F ; MAZE2 PF1
- HEX 121212121212
- HEX 141414141414
- HEX 181818181818
- HEX FFFFFFFFFFFF ; MAZE1 PF1
- HEX 202020202020
- HEX 404040404040
- HEX 808080808080
- HEX F0F0F0F0F0F0 ; MAZE0 PF0
- HEX 404040404040
- HEX 202020202020
- HEX 101010101010
-
- ORG $1FF8-146
- SKBODY1 HEX 70 70 70 F8 F8 F8 B8 B8 B8 78 78 78 F8 F8 F8
- HEX 78 78 78 D0 D0 D0 10 10 10 78 78 78 F8 F8 F8
- HEX F8 F8 F8 08 08 08 F8 F8 F8 08 08 08 F8 F8 F8
- HEX 08 08 08 38 38 38 08 08 08 38 38 38 38 38 38
- HEX 38 38 38 10 10 10 10 10 10 10 10 10 10 10 10
- HEX 10 10 10 10 10 10 10 10 10 20 20 20 10 10 10
- HEX 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
- HEX 70 70 70 00
- SKBODY3 HEX 70 F8 B8 78 F8 78 D0 10 78 F8 F8 08 F8 08 F8 08 38 08 38
- HEX 38 38 10 10 10 10 10 10 10 20 10 10 10 10 10 10 70 00
-
- ORG $1FF8 ; Supercharger bankswitch
- DC.B "1SL1"
-
- ORG $1FFC ; end of 4K cart
- DC.W START ; reset vector
- DC.W START ; IRQ vector
-
-
-